﻿#ifndef ISISTEMA_H
#define ISISTEMA_H

#include "Cadena.h"
#include "Iterador.h"
#include "Puntero.h"
#include "TipoRetorno.h"
#include "Tupla.h"
#include "ICiudad.h"
#include "IAtraccion.h"
#include "IExcursion.h"
#include "TipoTransporte.h"

class ISistema abstract
{
public:
	virtual ~ISistema(){}

	// Hito de Control Tipo 1
	virtual TipoRetorno IngresoCiudad(Cadena nombre) abstract;
	virtual TipoRetorno IngresoAtraccion(Cadena identificador, Cadena nombre, nat horarioInicio, nat horarioFin, Cadena nombreCiudad, nat precio) abstract;
	virtual TipoRetorno CalificarAtraccion(nat fechaCalificacion, Cadena idAtraccion, int calificacion, Cadena comentarios) abstract;
	virtual TipoRetorno AltaConexion(Cadena ciudadOrigen, Cadena ciudadDestino, nat distancia, nat omnibus, nat aviones) abstract;
	virtual Tupla<TipoRetorno, pAtraccion> ConsultaAtraccion(Cadena idAtraccion) abstract;
	virtual Tupla<TipoRetorno, Iterador<Tupla<Cadena, Cadena, TipoTransporte, nat>>> Transportes() abstract;

	// Entrega final Tipo 1
	virtual Tupla<TipoRetorno, pCiudad> CiudadMejoresAtracciones() abstract;
	virtual TipoRetorno IngresoExcursionItinerario(nat nroExcursion, nat fecha, Iterador<Cadena> itinerario) abstract;
	virtual TipoRetorno IngresoExcursionDistancia(nat nroExcursion, nat fecha, nat tiempoMax, Cadena ciudadOrigen, Cadena ciudadDestino, Iterador<Cadena> ciudadesNoDeseadas) abstract;
	virtual TipoRetorno IngresoExcursionCosto(nat nroExcursion, nat fecha, Cadena ciudadOrigen, Cadena ciudadDestino) abstract;
	virtual Tupla<TipoRetorno, pExcursion> ConsultaExcursion(nat nroExcursion) abstract;
	virtual Tupla<TipoRetorno, Iterador<pCiudad>> ListadoCiudades() abstract;

	// Entrega final Tipo 2
	virtual Tupla<TipoRetorno, bool> HayCamino(Cadena ciudadOrigen, Cadena ciudadDestino) abstract;
	virtual Tupla<TipoRetorno, Iterador<pAtraccion>> AtraccionesAVisitarA(nat nroExcursion, nat dineroMax) abstract;
	virtual Tupla<TipoRetorno, Iterador<pAtraccion>> AtraccionesAVisitarB(nat nroExcursion, nat dineroMax) abstract;
	virtual Tupla<TipoRetorno, nat> MaximosViajantes(Cadena ciudadOrigen, Cadena ciudadDestino) abstract;

	// Operaciones opcionales
	virtual Tupla<TipoRetorno, Iterador<pCiudad>> CiudadesEsenciales(Cadena ciudadOrigen, Cadena ciudadDestino, TipoTransporte tipoTransporte) abstract;
};

#endif
